package com.glf.tool.qchz.hr;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.glf.tool.pojo.HRAssestInfo;
import com.glf.tool.pojo.HRResourceInfo;
import com.glf.tool.pojo.XlsData;
import com.glf.tool.utils.EasyExcelUtil;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.*;

import java.io.*;
import java.util.*;

/**
 * 读取各个村级资源文件汇总一张表
 * <p>
 * 使用说明：
 * 1.检查村文件夹的名称是否规范，必须包含如下内容，示例：xx镇xx村.xls。（必须有“村”结尾）
 * 2.检查xls文件中的标题是否统一
 * 3.检查运行日志中的为 数据：0 的的文件是否是空的
 * <p>
 * 输出目录：out/xx镇.xlsx
 */
public class HRResourceFileUtil {
    //详细日志开关
    private final static boolean LOG_DETAIL_TAG = false;
    //输出目录，默认当前项目根目录out文件夹
    private final static String OUT_FILE_PATH = "out\\";


    // 资源配置
    //所有数据的文件根目录
//    private final static String ROOT_FOLDER_PATH = "D:\\wpkj\\以图管地数据\\清产核资\\华容区新系统资产、资源表\\蒲团乡南大12.14版本9个村";
    private final static String ROOT_FOLDER_PATH = "D:\\wpkj\\以图管地数据\\清产核资\\临空";

    //扫描文件关键字
    private final static String SCAN_KEY_WORD = "资源信息";
    //扫描的第一个关键字，检查是否会出现空数据，行错位问题不在第一行的问题
    private final static String FIRST_TITLE = "*所属组织识别码";
    //数据合并导出模板
    private final static String TEMPLATE = "template/hr_resource_tep.xlsx";


    public static void main(String[] args) {
        HRResourceFileUtil readResourceXlsFiles = new HRResourceFileUtil();
        readResourceXlsFiles.start();
    }

    private static List<HRResourceInfo> xlsDataList = new ArrayList<>();

    public void start() {
        File rootFolder = new File(ROOT_FOLDER_PATH);
        if (rootFolder.exists() && rootFolder.isDirectory()) {
            // 开始遍历查找符合条件的文件
            findXlsFilesContainingResource(rootFolder);

            System.out.println("数据长度；" + xlsDataList.size());

            System.out.println("开始写入：" + xlsDataList.size());
            Map<String, Object> map = new HashMap<>();
            map.put("data", xlsDataList);
            setNewXlsFile(map);
            System.out.println("写入完成：" + xlsDataList.size());
        } else {
            System.err.println("指定的根文件夹不存在或者不是有效的文件夹");
        }
    }

    public void findXlsFilesContainingResource(File folder) {
        File[] files = folder.listFiles();
        if (files != null) {
            for (File file : files) {
                boolean xlsTag = file.getName().toLowerCase().endsWith(".xls") || file.getName().toLowerCase().endsWith(".xlsx");
                if (file.isDirectory()) {
                    // 如果是文件夹，递归调用继续遍历该文件夹下的内容
                    findXlsFilesContainingResource(file);
                } else if (file.getName().toLowerCase().contains(SCAN_KEY_WORD) && xlsTag) {
                    // 如果是文件且满足名称包含"资源"以及后缀为".xls"的条件，则输出其绝对路径
//                    System.out.println(file.getAbsolutePath());
                    getXlsData(file.getAbsolutePath());
                }
            }
        }
    }

    public void getXlsData(String path) {

        int lineNum = checkTileLineNum(path);
        if (lineNum == -1) {
            System.err.println("-------------------错误-------------------");
            System.err.println("文件出错，可能没有正确标题（" + path + "）");
            System.err.println("------------------------------------------");
        } else {
            ImportParams params = new ImportParams();
            params.setTitleRows(lineNum);
            params.setHeadRows(1);
            params.setKeyIndex(1);

            List<HRResourceInfo> excelImportCos = EasyExcelUtil.importExcelExcep(new File(path), HRResourceInfo.class, params);
//            System.out.println("输出excel返回实体======>" + excelImportCos.toString());
            for (int i = 0; i < excelImportCos.size(); i++) {
                excelImportCos.get(i).setPath(path);
            }
            xlsDataList.addAll(excelImportCos);
            String logStr = "数据：" + excelImportCos.size();
            if (LOG_DETAIL_TAG) {
                logStr = logStr + "-(" + path + ")";
            }
            if (excelImportCos.size() == 0) {
                System.err.println(logStr);
            } else {
                System.out.println(logStr);
            }
        }


    }

    public String setNewXlsFile(Map<String, Object> map) {
        TemplateExportParams params = new TemplateExportParams(TEMPLATE, true);
        params.setColForEach(true);
        Workbook workbook = ExcelExportUtil.exportExcel(params, map);
        String excelPath = OUT_FILE_PATH;
        File savefile = new File(excelPath);
        if (!savefile.exists()) {
            savefile.mkdirs();
        }
        DateTime date = DateUtil.date();
        String yyyyMMddHHmmss = DateUtil.format(date, "yyyy-MM-dd-HH-mm-ss");
        String name = ROOT_FOLDER_PATH.substring(ROOT_FOLDER_PATH.lastIndexOf("\\") + 1);
        String path = excelPath + SCAN_KEY_WORD + yyyyMMddHHmmss + ".xlsx";    // 文件输出路径
        try {
            FileOutputStream fos = new FileOutputStream(path);
            workbook.write(fos);
            fos.close();
            return path;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public int checkTileLineNum(String path) {
        try {
            // 导入参数设置
            ImportParams params = new ImportParams();
            // 指定要读取的Sheet索引或名称（默认为第1个）
            params.setStartSheetIndex(0);
            // "D:\\wpkj\\以图管地数据\\清产核资\\走马镇测试数据\\走马镇千金村公示全部成果\\资源.xls"
            File excelFile = new File(path);
            InputStream fileInStream = new FileInputStream(excelFile);
            // 加载Excel文件并将其转换为Workbook对象
            Workbook workbook = WorkbookFactory.create(fileInStream);

            // 根据工作表索引或名称获取Sheet对象
            Sheet sheet = workbook.getSheetAt(params.getStartSheetIndex());

            // 遍历所有行
            for (Row row : sheet) {
                // 创建一个空列表来存储当前行的字符串值
//                List<Object> values = new ArrayList<>();
                // 遍历当前行的单元格
                for (Cell cell : row) {
                    // 判断单元格类型并添加到values列表中
                    switch (cell.getCellType()) {
                        case STRING:
                            String stringCellValue = cell.getStringCellValue();
                            if (stringCellValue.equals(FIRST_TITLE)) {
                                return row.getRowNum();
                            }
                            break;
                    }
                }
            }
            // 关闭workbook
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1;
    }

}

